package com.fingard.dsp.bank.directbank.bony02;


import com.fingard.dsp.bank.directbank.bankInterface.IBalance;
import com.fingard.dsp.bank.reqrespobj.balance.Req7505HisBalQry;
import com.fingard.dsp.bank.reqrespobj.balance.Req7506BalQry;
import com.fingard.dsp.bank.reqrespobj.balance.RetAts7505HisBalQry;
import com.fingard.dsp.bank.reqrespobj.balance.RetAts7506BalQry;
import com.fingard.dsp.bank.reqrespobj.balance.detail.RetAtsBalDetail;
import com.fingard.xml.XmlTextReader;
import com.fingard.xml.XmlTextWriter;

public class BONY02Balance extends BONY02Base implements IBalance {

    //单个余额查询和批量余额查询，统一采用流处理方式
    //1、循环调用Req7506BalQry.readRecord()读取一个请求明细，然后写入发银行的XML对象
    //2、发银行
    //3、循环调用XmlTextReader.read()读取一个银行返回节点，赋值返回ATS的明细对象，
    //   然后调用RetAts7506BalQry.writeRetDetail()，写入返回ATS的明细
    @Override
    public RetAts7506BalQry d_7506_BalQry(Req7506BalQry p_req7506) throws Exception {
        //余额查询返回ATS对象
        RetAts7506BalQry retAts = new RetAts7506BalQry(p_req7506.reqHeader);
        retAts.writeStart();//写返回ATS的统一头部信息
        try {
            //赋值通用参数
            transCode = "DealQueryCurBal";
            while (p_req7506.readRecord()) {
                XmlTextWriter xmlWriter = new XmlTextWriter();//发银行报文的XML对象
                //写入通用头部节点
                seqNo = getQryTransID();
                writeCommonHeader(xmlWriter);
                //写入报文体
                xmlWriter.writeStartElement("body");
                xmlWriter.writeStartElement("entity");
                xmlWriter.writeElementString("accountCode", p_req7506.readedDetail.actNum);//账户
                xmlWriter.writeElementString("acct_seqno", "");//序号
                xmlWriter.writeEndElement();
                xmlWriter.writeEndElement();
                xmlWriter.writeEndDocument();
                //发送银行前置机
                String[] tmpStrRet = sendToBank(xmlWriter.toXmlString());
                RetAtsBalDetail tmpRetDetail = new RetAtsBalDetail();
                if (tmpStrRet[0].length() == 0) {
                    StringBuilder tmpSbMsg = new StringBuilder();
                    XmlTextReader tmpBkReader = loadBankRespXmlReader(tmpStrRet[1], tmpSbMsg);
                    if (tmpBkReader != null) {
                        String retCode = tmpBkReader.getSimpleText("retCode");
                        String respMsg = tmpBkReader.getSimpleText("retMsg").trim();
                        if (retCode != null && isActiveRetCode(retCode)) {
                            while (tmpBkReader.read("/response/body/entity")) {
                                tmpRetDetail.respCode = "0";//成功
                                tmpRetDetail.availBal = tmpBkReader.readedXElement.getSingleText("usableMoney");//可用余额
                                tmpRetDetail.currBal = tmpBkReader.readedXElement.getSingleText("remainMoney");//账面余额
                                tmpRetDetail.actNum = p_req7506.readedDetail.actNum;
                                tmpRetDetail.actCur = p_req7506.readedDetail.actCur;
                            }
                        } else {
                            tmpRetDetail.respCode = retCode;
                            tmpRetDetail.respInfo = respMsg;
                        }
                    } else {
                        tmpRetDetail.respCode = "-1";
                        tmpRetDetail.respInfo = tmpSbMsg.toString();
                    }
                } else {
                    tmpRetDetail.respCode = "-1";
                    tmpRetDetail.respInfo = tmpStrRet[1];
                }
                retAts.writeRetDetail(tmpRetDetail, p_req7506.isBatch);//是否批量
            }
        } catch (Exception e) {
            retAts.writeRespCode("-1");
            retAts.writeRespInfo(e.getMessage());
            e.printStackTrace();
        }
        retAts.writeEnd();
        return retAts;
    }

    @Override
    public RetAts7505HisBalQry d_7505_BalQry(Req7505HisBalQry p_req7505) throws Exception {
        return null;
    }
}
